﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI.WebControls;
using Entidades;

namespace WEB_IUS.Clases
{
    public class PerfilesTV
    {
        string msg;
        public Boolean lErrorG;

        iusEntities ctx;
        public List<menu> FindPadres(string modulo)
        {
            var q = from c in ctx.menu
                    where c.PADREID == c.MENUID && c.MODULO.Equals(modulo)
                    select c;
            return q.ToList();

        }

        public void cargarMenu(TreeView tvw, String modulo, int perfil)
        {
            //     Me._Modulo = Modulo
            tvw.Nodes.Clear();
            using (ctx = new iusEntities())
            {
                List<menu> itemPadres = FindPadres(modulo);

                foreach (menu item in itemPadres)
                {

                    if (item.MENUID == item.PADREID)
                    {
                        TreeNode mnNodo = new TreeNode();
                        mnNodo.Value = item.MENUID;
                        mnNodo.Text = item.TITULO;
                        //mnNodo.ImageUrl = item.IMAGEN;
                        mnNodo.NavigateUrl = item.URL;
                        mnNodo.ShowCheckBox = false;
                        mnNodo.ToolTip = item.DESCRIPCION;
                        tvw.Nodes.Add(mnNodo);
                        AddMenuNodo(mnNodo, item, perfil);
                    }
                }

            }
            tvw.ExpandAll();
        }

        public void AddMenuNodo(TreeNode mnuNodoItem, menu item, int perfil)
        {
            foreach (menu itemHijo in item.menu1)
            {
                if (itemHijo.MENUID != itemHijo.PADREID)
                {
                    //VALIDAR LOS ROLES
                    // if (this.IsUserInRole(drMenuItem("ROLES").ToString) == true && drMenuItem("habilitado").ToString == "1")

                    TreeNode mnuNewNodeItem = new TreeNode();
                    mnuNewNodeItem.Value = itemHijo.MENUID;
                    mnuNewNodeItem.Text = " " + itemHijo.TITULO;
                    mnuNewNodeItem.ToolTip = itemHijo.ROL;
                    mnuNewNodeItem.ImageUrl = itemHijo.IMAGEN;
                    mnuNewNodeItem.NavigateUrl = item.URL;
                    mnuNewNodeItem.ShowCheckBox = true;
                    //mnuNewMenuItem.Target = item.tar;
                    if (!String.IsNullOrEmpty(itemHijo.ROL))
                    {
                        mnuNewNodeItem.Checked = IsRolInPerfil(perfil, itemHijo.MENUID);
                    }
                    mnuNodoItem.ChildNodes.Add(mnuNewNodeItem);
                    //llamada recursiva para ver si el nuevo menú ítem aun tiene elementos hijos.
                    AddMenuNodo(mnuNewNodeItem, itemHijo, perfil);
                    //}
                }

            }

        }

        public Boolean IsRolInPerfil(int perfil, string menuid)
        {
            using (ctx = new iusEntities()){
                int c = (from m in ctx.menu_perfiles
                         where m.ID_PERFIL == perfil && m.ID_MENU == menuid
                         select m).Count();
                if (c == 0)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
        
        }

        public string AsigPermisosAPerfil(perfiles p, TreeView Tvw)
        {

            try
            {
                using (ctx = new iusEntities())
                {
                    ctx.AddToperfiles(p);
                    ctx.SaveChanges();
                    this.lErrorG = false;
                    foreach (TreeNode n in Tvw.Nodes)
                    {
                        this.AsigOpcionesAPerfilN(n, p.id);
                        msg = "Se Realizó la Operación Satisfactoriamente";
                        lErrorG = false;
                    }
                    return this.msg;
                }
                
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                lErrorG = true;
            }

            return msg;
        }

        public string ModPermisosAPerfil(int idp, TreeView Tvw)
        {

            try
            {
                using (ctx = new iusEntities())
                {
                    perfiles p = (from pe in ctx.perfiles
                                  where pe.id == idp
                                  select pe).FirstOrDefault();

                    foreach (menu_perfiles mep in p.menu_perfiles)
                    {
                        ctx.DeleteObject(mep);
                        ctx.SaveChanges();
                    }
                    foreach (TreeNode n in Tvw.Nodes)
                    {
                        this.AsigOpcionesAPerfil(n, idp);
                        msg = "Se Realizó la Operación Satisfactoriamente";
                        lErrorG = false;
                    }
                    return this.msg;
                }

            }
            catch (Exception ex)
            {
                msg = ex.Message;
                lErrorG = true;
            }

            return msg;
        }

        public void AsigOpcionesAPerfil(TreeNode Tvw, int idperfil)
        {
                perfiles p = (from pe in ctx.perfiles
                              where pe.id == idperfil
                              select pe).FirstOrDefault();

                foreach (TreeNode Node in Tvw.ChildNodes)
                {
                    AsigOpcionesAPerfil(Node, idperfil);
                    int menuid = Convert.ToInt32(Node.Value);
                    string roleName = Node.ToolTip;
                    if (!string.IsNullOrEmpty(roleName))
                    {
                        if ((Node.Checked == true) & (IsRolInPerfil(idperfil, Node.Value) == false))
                        {
                            //Roles.AddUserToRole(username, roleName);
                            menu_perfiles mp = new menu_perfiles();
                            mp.ID_MENU = Node.Value;
                            mp.ID_PERFIL=idperfil;
                            p.menu_perfiles.Add(mp);
                            ctx.AttachUpdated(p);
                            ctx.SaveChanges();
                        }
                    }
                }
            
        }

        public void AsigOpcionesAPerfilN(TreeNode Tvw, int idperfil)
        {
                perfiles p = (from pe in ctx.perfiles
                              where pe.id == idperfil
                              select pe).FirstOrDefault();

                foreach (TreeNode Node in Tvw.ChildNodes)
                {
                    AsigOpcionesAPerfilN(Node, idperfil);
                    int menuid = Convert.ToInt32(Node.Value);
                    string roleName = Node.ToolTip;
                    if (!string.IsNullOrEmpty(roleName))
                    {
                        if (Node.Checked == true)
                        {
                            //Roles.AddUserToRole(username, roleName);
                            menu_perfiles mp = new menu_perfiles();
                            mp.ID_MENU = Node.Value;
                            mp.ID_PERFIL = idperfil;
                            p.menu_perfiles.Add(mp);
                            ctx.AttachUpdated(p);
                            ctx.SaveChanges();
                        }
                    }
                }

        }
    }
}